#ifndef __HEAD__
#define __HEAD__
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
#include <strings.h>
#include <sys/socket.h>
#include <pthread.h>
#include <unistd.h>
#include <error.h>
#include <errno.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include "taskQueue.h"
#include <sys/types.h>
#include <sys/wait.h>
#include <shadow.h>
#include <crypt.h>
#include <stdbool.h>
#include <syslog.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <fcntl.h>
#define LOG_CHECK(opt, arg)                                                                                           \
{                                                                                                                     \
    time_t tmp = time(NULL);                                                                                            \
    char buf[1024] = {0};                                                                                           \
    if (strcmp(opt, "login") == 0) {                                                                                  \
        syslog(LOG_DEBUG, "user: %s login core_file:%s : %d ,time : %s", arg, __FILE__, __LINE__, ctime_r(&tmp, buf));  \
    } else {                                                                                                          \
        syslog(LOG_DEBUG, "cmd: %s dir : %s  core_file:%s : %d , time : %s", opt, arg, __FILE__, __LINE__, ctime_r(&tmp, buf)); \
    }                                                                                                                 \
}
//设计数据结构
//进程想要管理线程池需要为工作线程定义数据结构
//1、需要知道有多少个工作线程-》workernum
//2、需要知道线程的tid来创建和撤销
//3、需要一个任务队列，因为线程和进程是共享文件的，所以这个任务队列可以被看到
typedef struct threadPool_s{
    int workerNum;//工作线程数量也就是线程池的大小
    pthread_t* tidArry;//线程的tid合集
    taskQueue_t taskQueue;//任务队列
    pthread_mutex_t mutex;
    pthread_cond_t cond;
    int exitflag;
}threadPool_t;

typedef struct train_s{
     int length;
     char data[4096];
}train_t;
typedef struct stacknode_s{
    char* data;
    struct stacknode_s* next;
}stacknode_t;

typedef struct stack1_s{
    stacknode_t* top;
    stacknode_t* bottom;
    int stacksize;
}stack1_t;
//栈函数
bool isempty(stack1_t stack);
int pop(stack1_t* stack,char* del_data);
int push(stack1_t* stack,char* add_data);
int travel_stack(stack1_t stack,char* workingdir);
void print_stack(stack1_t dir);
void onePath(const char* arg,char* onepath,stack1_t* dir);
int cdFunc(const char* arg,stack1_t* dir);
int makeWorker(threadPool_t * pthreadPool);
int recvn(int netfd,void* buf,int length);//recvn函数接受大文件
int login(int netfd,char* uname);//获取登录用户的用户名及密码。并且验证是否成功
int pwdFunc(int netfd,stack1_t dir);
int mkdirFunc(const char* dir1,stack1_t pdir);
int rmdirFunc(const char* filename,stack1_t pdir);
int removeFunc(const char* filename,stack1_t pdir);
void lsFunc(char* arg,int netfd,stack1_t* dir);
int putsText(const char* arg,int netfd,stack1_t dir);
#endif
